home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / progs / editor / frexxed / fpl / checklinks.fpl < prev    next >
Text File  |  1995-07-18  |  3KB  |  130 lines

  1. export void CheckLinks()
  2. {
  3.   int page;
  4.   string block;
  5.   int number;
  6.   int max;
  7.   int line = ReadInfo("line");
  8.   int col = ReadInfo("byte_position");
  9.   string nodes[100];
  10.   int size=100;
  11.   int numofnode=0;
  12.  
  13.   /*
  14.      FIRST:
  15.      
  16.      Find all occurences of
  17.      
  18.      @node nodename
  19.      
  20.      nodename might be within quotes.
  21.      
  22.      Search pattern:
  23.      
  24.      ^[ \t]*@node[ \t]+("[^"]*"|[^ ]*)
  25.      
  26.      Hold all such names in an array for fast validity checks for each link
  27.      in the file.
  28.      
  29.      THEN
  30.      
  31.      Scan for all occurences that look like
  32.      
  33.      @{  "name name"  link  "todeloo"  0   }
  34.      A  B     C      D  E  F    G    H I J K
  35.      
  36.      A = hard string "@{"
  37.      B = optional white space
  38.      C = button name within quotes
  39.      D = at least one character white space
  40.      E = hard string "link"
  41.      F = see D
  42.      G = node name within quotes, or if without quotes white space terminated.
  43.      H = optional white space (required if 'I' is present)
  44.      I = optional line number in the node
  45.      J = optional white space
  46.      K = hard string "}"
  47.      
  48.      We want the G-name, without quotes!
  49.      
  50.      Search pattern:
  51.      
  52.      @{[ \t]*"[^"]*"[ \t]+link[ \t]+("[^"]*"|[^ \t}]*)[^}]*}
  53.      */
  54.  
  55.   const string nodepattern = "^[ \t]*@node[ \t]+(\"[^\"]*\"|[^ ]*)";
  56.   const string linkpattern = "@{[ \t]*\"[^\"]*\"[ \t]+link[ \t]+(\"[^\"]*\"|[^ \t}]*)[^}]*}";
  57.  
  58.   Visible(0);
  59.   GotoLine(1);
  60.   Status(0, "Reading all nodes...");
  61.   while(!Search(nodepattern, "wf+")) {
  62.     string junk = ReplaceMatch(nodepattern, "\\1");
  63.     if(strlen(junk)) {
  64.       if(junk[0]=='\"') {
  65.         /* strip quotes */
  66.         junk = substr(junk, 1, strlen(junk)-2);
  67.       }
  68.       nodes [ numofnode++ ] = junk;
  69.       if(numofnode == size) {
  70.         size += 100;
  71.         resize nodes[size];
  72.       }
  73.     }
  74.   }
  75.   if(numofnode) {
  76.     int node_used[numofnode];   /* to mark number of links to each node! */
  77.     string enter;
  78.     int item;
  79.     Status(0, "Checking all links...");
  80.     GotoLine(1);
  81.  
  82.     Sort( &nodes, numofnode, 1);
  83.  
  84.     while(!Search(linkpattern, "wf+")) {
  85.       string junk = ReplaceMatch(linkpattern, "\\1");
  86.       if(strlen(junk)) {
  87.         if(junk[0]=='\"') {
  88.           /* strip quotes */
  89.           junk = substr(junk, 1, strlen(junk)-2);
  90.         }
  91.         Status(0, sprintf("Checking link to %s", junk));
  92.  
  93.         item = BSearch(&nodes, junk, numofnode, 1);
  94.         if(-1 == item && -1 == strstr(junk, "/")) {
  95.           int line = ReadInfo("line");
  96.           if(0 == Request(sprintf("Line %d:\nNode %s isn't found!\nContinue?", line, junk),
  97.                           "Link alarm!"))
  98.             return;
  99.         }
  100.         else {
  101.           if(item != -1)
  102.             node_used[item]++;
  103.         }
  104.       }
  105.     }
  106.     if( 1 == Request("You want the summary?") ) {
  107.       string name = ReadInfo("file_name");
  108.       int id = New();
  109.       if(id) {
  110.         int a;
  111.         CurrentBuffer(id);
  112.         Rename(sprintf("*%s Summary*", name));
  113.         for(a=0; a<numofnode; a++) {
  114.           Output(sprintf("%s has %d links pointing to it %c\n", nodes[a],
  115.                          node_used[a],
  116.                          node_used[a]?' ':'*'));
  117.         }
  118.         SetInfo(id, "changes", 0); /* mark this as no changes done! */
  119.       }
  120.       else {
  121.         ReturnStatus("Summary failed!");
  122.       }
  123.     }
  124.   }
  125.   else {
  126.     ReturnStatus("No nodes were found!\n");
  127.   }
  128.   GotoLine(line, col);          /* get back */
  129. }
  130.